引言
今天來解逆向工程的題目吧!
逆向工程 聽起來好像很厲害,但其實就是一種過程而已。
[維基百科: 逆向工程]
逆向工程(Reverse Engineering),又稱反向工程,是一種技術過程,即對一專案標產品進行逆向分析及研究,從而演繹並得出該產品的處理流程、組織結構、功能效能規格等設計要素,以製作出功能相近,但又不完全一樣的產品。
對市面上軟體的深入分析後再設法重造,也算是一種逆向工程。
這主題的題目會提供一些結果給你 (檔案等) ,請你設法從中找出正常使用下或許無法取得的資訊。
一個最好理解的例子是:拿到二進位檔,設法取得某程式碼區塊的資訊,或是某某變數的值等。
Reverse Engineering / Transformation
這題看起來跟編碼有關,因為它除了提供了一個叫做 enc
的檔案外,
也提供了一段 Python code ,能看到程式碼中有 chr
、 ord
等熟悉語法,
這兩者正是用來做字串、編碼轉換用途的。
分析完題目,我們先把 enc
下載下來看看:
灩捯䍔䙻ㄶ形楴獟楮獴㌴摟潦弸強㕤㐸㤸扽
很好,這就是我們玩遊戲或是使用國外軟體時常遇到的亂碼對吧!
這邊也可以來學習一點小知識,其實所謂的亂碼,就是編碼不對的問題罷了。
世界上所有的編碼,包括 UTF-8, ASCII, BIG5 等等常看到的編碼,
最後都是轉換成 01010101... ,因為電腦也只看得懂 0101 對吧?
所以你可以試想一個情境:
假設 apple
這個字的 UTF-8 編碼是 01010000 (純粹假設,並不是這個編碼) ,
今天如果寫信的人他使用 UTF-8 編碼規則,寫了一個 apple
並編成 UTF-8 ,
最後送到你手裡,因此你會收到 01010000 這個編碼後的資料。
然後你搞錯對方的編碼方式,你用 ASCII 來解碼這個訊息,
01010000 剛好是 P
的 ASCII code ,所以這封信意思就變成 P
。
從頭到尾,信件內容 (01010000) 都沒變,變的是你們雙方的編碼方式。
所以亂碼其實就是雙方編碼不同造成的誤會,
日本人寫的遊戲中的文字編碼可能是 Shift_JIS 這個編碼,
拿到你的電腦來可能用 BIG5 解碼,當然就是一堆亂碼囉。
所以才會有萬國碼的存在,讓各種語言都可以統一成一種編碼來表示。
回到題目,提示說你可以到網路上找找解碼器,但是我們並不知道這個亂碼本來的編碼是什麼。
所以我先找到一個多功能編碼器:
https://string-functions.com/encodedecode.aspx
它可以解編碼許多不同的編碼方式,這時候就只能猜了。
但是並不是瞎猜,還記得題目有給一段 Python 程式對吧,
可以看到它將 flag 字串每個字元編碼往左邊移八位 (位元運算) ,
然後加上該字元的右邊字元的編碼,最後再編成新字元。
講起來很複雜,其實就是將兩個字元編成一個字元的概念,
UTF-8 是很常使用的編碼,我們先猜測原本是用 UTF-8 來撰寫訊息的,
那麼兩個八位元的字元組合成一個十六位元的字元,合理猜測有可能是 UTF-16 !
所以我們將亂碼丟到轉換器中,選擇 UTF-16 轉 UTF-8 :
哦?結果看起來不是亂碼了,非常像 flag 形式,但又不是...
觀察後發現兩兩一組的話,每一組都前後顛倒了,
難道編碼還是錯誤?
打開轉換的選單:
還有另一種 UTF-16 ?
改成這個以後:
成功找到 flag !
p.s: UTF-16 有分成 Big Endian 以及 Little Endian (位元組順序) ,
這題剛好是需要 BE (Big Endian) 的版本。